// pages/cart/index.js
Page({

    /**
     * 页面的初始数据
     */
    data: {
        cartArray: [],
        // 控制购物车结算
        totalMoney: '0.00',
        totalCount: 0,
        selectAll: false,
        startX:0,//点击开始坐标
        startY: 0,//点击开始坐标
    },

    /**
     * 生命周期函数--监听页面加载(1次)
     */
    onLoad: function(options) {},

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady: function() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow: function() {
        let _this = this;
        wx.getStorage({
            key: 'cartInfo',
            success: function(res) {
                // 对本地存储里的数据遍历给每个加上一个开关;用来控制购物车的商品是否选中
                res.data.forEach(cart => {
                    cart.select = false;
                    // 给每个cart下的属性加一个是否滑动的属性默认为false
                    cart.isTouchMove = false;
                })

                _this.setData({
                    cartArray: res.data,
                    selectAll:false,
                    totalMoney:"0.00",
                    totalCount:0
                })
                //   tabber中的购物车数量显示
                res.data.length > 0 ?
                    wx.setTabBarBadge({
                        index: 2,
                        text: String(res.data.length),
                    }) : wx.removeTabBarBadge({
                        index: 2,
                    })
            },
        })

    },
    selectGood(e) { //商品是否选中
        let index = e.currentTarget.dataset.index;
        let cartArray = this.data.cartArray;
        // 计算数量和总价
        let totalMoney = Number(this.data.totalMoney);
        let totalCount = this.data.totalCount;
        // 解决在全选后再点击各别商品取消还有存在selectAll选中状态
        let selectAll = this.data.selectAll;
        cartArray[index].select = !cartArray[index].select;
        //点击的时候如果是被选中就计算
        if (cartArray[index].select) {
            // 总个数和价位相乘赋值给总价
            totalMoney += Number( cartArray[index].price) * cartArray[index].cartTotal;
            totalCount++;
        } else { //没有选中的情况
            /**有一种情况就是你选中了后又取消了;这个情况下需要select把你取消的个数和数量也要同等的去移除 */
            totalMoney -= Number(cartArray[index].cartTotal) * cartArray[index].price;
            totalCount--;
            // 在没有选中的情况下让selectAll为false
            selectAll = false;
        }
        // 如果所有的select都为true 那么selectAll就应该选中

        this.setData({
            cartArray: cartArray,
            totalMoney: String(totalMoney.toFixed(2)),
            totalCount: totalCount,
            selectAll: selectAll
        })
        let arrs = [];
        arrs = cartArray.find(function(cart){
            return cart.select == false
        })
        if (arrs == undefined){
            this.setData({
                selectAll: true
            })
        }
    },
    addevent(e) { //增加数量触发事件
        /**在增加时候让在选择状态中的数量合计发生变化 */
        const index = e.currentTarget.dataset.index
        const cartArray = this.data.cartArray
        let totalMoney = Number(this.data.totalMoney)
        // 计算总价
        if (cartArray[index].select) {
            totalMoney += Number(cartArray[index].price)
        }
        this.setData({
            totalMoney: String(totalMoney.toFixed(2))
        })

    },
    subevent(e) { //减少数量触发事件
        let cartArray = this.data.cartArray;
        let index = e.currentTarget.dataset.index;
        let totalMoney = Number(this.data.totalMoney);
        // 计数总价
        if (cartArray[index].select) {
             console.log(cartArray[index])
            totalMoney -= Number(cartArray[index].price )

        }
            console.log(totalMoney)
            this.setData({
                totalMoney: String(totalMoney.toFixed(2))
            })
        
    },
    onGetCount(e) { //监听input数据变化
        /*用户手输数量的时候我们需要把用户输入的数量更新到本地存储中*/
        let index = e.currentTarget.dataset.index;
        let cartArray = this.data.cartArray;
        let totalMoney = Number(this.data.totalMoney);
        cartArray[index].cartTotal = e.detail.val;
        // 判断选中状态事如果Input发生了变化需要修改合计
        // if (cartArray[index].select){
        //     totalMoney = Number(cartArray[index].cartTotal *cartArray[index].price)
        // }
        // 更新data
        this.setData({
            cartArray: cartArray,
            // totalMoney: String(totalMoney.toFixed(2))
        })

    },
    selectAll() { //全选
        let cartArray = this.data.cartArray;
        let selectAll = this.data.selectAll;
        let totalCount = 0;
        let totalMoney = 0;
        selectAll = !selectAll;
        cartArray.forEach(cart => {
            // 设置选中状态或者不选中
            cart.select = selectAll;
            if (cart.select) { //如果为选中状态就让总数和价位相剩
                totalMoney += Number(cart.cartTotal * cart.price)
                totalCount++;
            } else { //不选中的情况
                totalCount = 0;
                totalMoney = 0;
            }
        })

        this.setData({
            cartArray: cartArray,
            selectAll: selectAll,
            totalMoney: String(totalMoney.toFixed(2)),
            totalCount: totalCount

        })
    },
    touchStart(e){//移动前点击的位置
        // 在开始触摸时将所有startTouchMove设置为flase,对当前的为true
        this.data.cartArray.forEach(cart =>{
            if(cart.isTouchMove)//当istouchMove为true
                cart.isTouchMove = false;//其它的对象都为false
        })
        this.setData({
            startX: e.changedTouches[0].clientX,
            startY: e.changedTouches[0].clientY,
            cartArray: this.data.cartArray
        })
    },
    touchmove(e){//移动的位置,用于计算用户滑动的弧度向左还是向右,移动了多少,可以确定删除功能的显示和隐藏
        let index = e.currentTarget.dataset.index;
        // 获取开始的x,y坐标
        let startX = this.data.startX,
            startY = this.data.startY;
        // 获取移动的x,x坐标
        let touchMoveX = e.changedTouches[0].clientX,
            touchMoveY = e.changedTouches[0].clientY;
        // 调用计算角度的方法,获取角度
        var angel = this.angel({ X: startX, Y: startY }, { X: touchMoveX, Y: touchMoveY })
        // 遍历cartArray
        this.data.cartArray.forEach((cart, i ) =>{
            cart.isTouchMove = false;
            // 滑动角度大于30,直接return 视为非滑动意思
            if(Math.abs(angel) > 30) return;
            // 匹配当前所点击的list和滑动的list
            if(i == index){
                // 匹配上后判断滑动方向
                if (touchMoveX > startX){//左滑动隐藏删除
                    cart.isTouchMove = false;
                }else{
                    cart.isTouchMove = true;
                }
            }
        })
        // 更新数据
        this.setData({
            cartArray:this.data.cartArray
        })
    },
    angel(start,end){//计算滑动的角度 
        // console.log(start,end)
        // 移动坐标减去对应的开始坐标
        var _X = end.X - start.X,
            _Y = end.Y - start.Y;
            // 返回角度 Math.atan() 返回数字的正切值
            return 360 * Math.atan(_Y / _X) / (2 * Math.PI)
    },
    del(e){//删除当前list
        let _this = this;
        let index = e.currentTarget.dataset.index;
        // 所点击的时候获取storage匹配与cartArray中的当前titile是否一致;一致就删除 
        wx.getStorage({
            key: 'cartInfo',
            success: function(res) {
                let partData = res.data;
                // 对返回的本地数组进行一个遍历
                partData.forEach((cart,i) =>{
                    if (cart.title == _this.data.cartArray[index].title){
                        // 删除本地存储的当前元素
                        partData.splice(i,1)
                    }
                })
                // 删除完后再存储
                wx.setStorage({
                    key: 'cartInfo',
                    data: partData,
                })
                // 更新数据
                _this.updata(index)
            },
        })

    },
    updata(index){//更新数据方法
        let cartArray = this.data.cartArray,
            totalMoney = Number(this.data.totalMoney),
            totalCount = this.data.totalCount;
        console.log(cartArray)
            // 计算合计和数量 
            if(cartArray[index].select){
                totalMoney -= Number(cartArray[index].cartTotal) * cartArray[index].price;
                console.log(Number(cartArray[index].cartTotal) * cartArray[index].price)
                totalCount --;
                // selectAll
            }
            // 删除
            cartArray.splice(index,1)
            this.setData({
                cartArray:this.data.cartArray,
                totalMoney: String(totalMoney.toFixed(2)),
                totalCount: totalCount
            })
            // 设置tabBar图标数量
            cartArray.length > 0 ?
                wx.setTabBarBadge({
                    index: 2,
                    text: String(cartArray.length),
                }):wx.removeTabBarBadge({
                    index: 2,
                })
    },
    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide: function() {
        //  在页面隐藏的时候对修改过的数据进行存储
        console.log(this.data.cartArray)
        let cartArray = this.data.cartArray;
        wx.setStorage({
            key: 'cartInfo',
            data: cartArray,
        })
    },
    switchGoodDetail(e) { //点击当前list模块带id参跳入商品详情页面
        console.log(111)
        let index = e.currentTarget.dataset.index;
        // 获取当前的data
        let cartArray = this.data.cartArray;
        // console.log(cartArray)
        // console.log(cartArray[index])
        // 所点击的list时候注入当前的id
        wx.navigateTo({
            url: '/pages/detail/index?id=' + cartArray[index].id,
        })

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload: function() {

    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh: function() {

    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom: function() {

    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage: function() {

    }
})